import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.function.Consumer;

public class Test {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        Collections.addAll(list,"1","2","3");
        list.forEach(System.out::println);
        list.iterator();
        list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {

            }
        });
    }
}


/*
省略参数类型：如果Lambda表达式的参数列表中只有一个参数，
并且该参数的类型可以根据上下文推断出来，则可以省略参数类型。
(String x) -> x + 1
(x) -> x + 1
省略参数括号：如果Lambda表达式的参数列表中只有一个参数，则可以省略参数括号。
复制代码
(String x) -> x + 1
x -> x + 1
省略花括号：如果Lambda表达式的函数体中只有一条语句，则可以省略花括号。
复制代码
x -> {System.out.println(x)}
x -> System.out.println(x)
省略return关键字：如果Lambda表达式的函数体中只有一条语句，
并且该语句的结果可以直接返回，则可以省略return关键字。
(x,y) - > return x+y
(x, y) -> x + y
方法引用：如果Lambda表达式的函数体中只是调用了某个方法或构造函数，则可以使用方法引用来简化代码
x -> System.out.println(x)
System.out::println
需要注意的是，Lambda表达式只能用于函数式接口的实现，
即只有一个抽象方法的接口
* */



// 匿名内部类方式
// foreach 底层原理:
// 其实也会自己遍历集合,依次得到每一个元素
// 把得到的每一个元素,交给 accept

/*
 * 细节注意点:
 *   1.报错NoSuchElementException2
 *   2.迭代器遍历完毕，指针不会复位
 *   3.循环中只能用一次next方法
 *   4.迭代器遍历时，不能用集合的方法进行增加或者删除
 * */

// 1.当上面循环结束之后,迭代器的指针就指向了没有元素的位置,此时使用it.next()便会报错
// String str = it.next(); NoSuchElementException
// 1.当上面循环结束之后,迭代器的指针就指向了没有元素的位置,此时使用it.next()便会报错
// String str = it.next(); NoSuchElementException

// 2.迭代器遍历完毕，指针不会复位
        //System.out.println(iterator.hasNext()); // false

//3.循环中只能用一次next方法
// 如果用了两次next方法,并且元素的个数为奇数,则会报错 NoSuchElementException
